import threading
import time
import atexit
import sys
import os
from concurrent.futures import ThreadPoolExecutor
import queue

# 导入独立音频播放器
from 组件.独立音频播放器 import get_audio_player, play_voice, start_audio_player, stop_audio_player

# 抑制 win10toast_click 的错误输出
import warnings
warnings.filterwarnings('ignore', category=DeprecationWarning)

try:
    from win10toast_click import ToastNotifier
    _TOAST_AVAILABLE = True
except ImportError:
    _TOAST_AVAILABLE = False
    print("警告: win10toast_click 未安装，将跳过Windows通知")

# 全局状态管理
_executor_shutdown = False
_notification_queue = queue.Queue(maxsize=100)  # 通知队列
_notification_executor = None


# 音频相关函数已移除，现在使用独立音频播放器

def init_notification_system():
    """初始化通知系统（包括音频播放器）"""
    # 启动独立音频播放器
    start_audio_player()
    print("通知系统已初始化")


def safe_show_notification(title, message):
    """安全地显示Windows通知，捕获所有可能的错误"""
    if not _TOAST_AVAILABLE:
        return 0
        
    try:
        # 创建新的 ToastNotifier 实例并立即使用
        toaster = ToastNotifier()
        
        # 临时重定向stderr以抑制库内部错误输出
        old_stderr = sys.stderr
        try:
            sys.stderr = open(os.devnull, 'w')
            toaster.show_toast(
                title=title,
                msg=message,
                duration=5,
                threaded=True,
            )
        finally:
            sys.stderr.close()
            sys.stderr = old_stderr
            
    except (TypeError, Exception) as e:
        # 忽略所有通知错误，包括 pywintypes.error 和其他Windows API错误
        # 这些错误不影响程序主要功能
        error_msg = str(e)
        if "Shell_NotifyIcon" not in error_msg and "WNDPROC" not in error_msg:
            pass  # 静默处理，不输出错误
        return 0


# 旧的独立音频播放器代码已移除，现在使用导入的独立音频播放器

def _notification_worker(title, message):
    """后台通知工作函数"""
    try:
        print(message)
        
        # 使用独立音频播放器播放语音
        play_voice(message)
            
        # 显示系统通知
        safe_show_notification(title, message)
        
        # 在后台线程中等待，不阻塞主线程
        time.sleep(3)
    except Exception as e:
        print(f"通知发送失败: {e}")


def _init_notification_executor():
    """初始化通知线程池"""
    global _notification_executor
    if _notification_executor is None:
        _notification_executor = ThreadPoolExecutor(max_workers=2, thread_name_prefix="Notification")
        print("通知线程池初始化成功")

def show_notification_thread(title, message):
    """在后台线程中显示通知，不阻塞主线程"""
    if _executor_shutdown:
        return
        
    try:
        # 初始化通知线程池
        _init_notification_executor()
        
        # 使用线程池提交任务
        _notification_executor.submit(_notification_worker, title, message)
        print(f"通知已提交: {title} - {message}")
        
    except Exception as e:
        print(f"提交通知失败: {e}")
        # 降级到直接线程方式
        thread = threading.Thread(
            target=_notification_worker, 
            args=(title, message), 
            daemon=True
        )
        thread.start()


# 程序退出时的清理
@atexit.register
def cleanup():
    global _executor_shutdown, _notification_executor
    _executor_shutdown = True
    
    # 关闭通知线程池
    if _notification_executor:
        _notification_executor.shutdown(wait=True)
        print("通知线程池已关闭")
    
    # 停止独立音频播放器
    stop_audio_player()
    
    time.sleep(0.5)  # 给线程完成的时间


# 使用示例
if __name__ == "__main__":
    # 初始化通知系统
    init_notification_system()
    
    # 测试通知
    show_notification_thread("测试通知", "您有一笔新的订单1")
    show_notification_thread("测试通知", "您有一笔新的订单2")
    
    # 等待测试完成
    time.sleep(10)
